package com.shop.service.impl;

import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.shop.mapper.Pms_Attr_Group_Mapper;
import com.shop.mapper.Pms_Product_Attr_Value_Mapper;
import com.shop.pojo.pms.Pms_Attr_Group;
import com.shop.pojo.pms.Pms_Product_Attr_Value;
import com.shop.service.Pms_Product_Attr_Value_Service;
import com.shop.utils.R;
import com.shop.vo.spuvalue.GroupByAttrByValues;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import java.util.ArrayList;
import java.util.List;
import java.util.Set;
import java.util.stream.Collectors;

@Service
public class Pms_Product_Attr_Value_ServiceImpl extends ServiceImpl<Pms_Product_Attr_Value_Mapper,Pms_Product_Attr_Value> implements Pms_Product_Attr_Value_Service {
    @Autowired
    private Pms_Product_Attr_Value_Mapper pms_product_attr_value_mapper;
    @Autowired
    private Pms_Attr_Group_Mapper pms_attr_group_mapper;

    @Override
    public void saveProductAttr(List<Pms_Product_Attr_Value> collect) {

        this.saveBatch(collect);//批量插入

    }
    /*
     * @Description
     * 1、首先根据spuid来查询全部数据
     * 2、取到这个全部数据里的全部attrid
     * 3、拿这个id去查询全部的属性分组名
     * 4、遍历这个属性分组名
     * 5、嵌套遍历第一个步骤
     * 6、进行一次查询，如果嵌套哦遍历里面的id可以查询到分组信息，并且这个分组id和外层遍历的一样，那么说明可以为他添加一个value
     * 7、最终将嵌套循环里的值都添加到集合
     * 8、最终赋值给我们的vo
     * @param spuId
     * @return com.shop.utils.R
     * @author liusupeng
     * @date 2020/11/8 23:25
     */
    @Override
    public R findGrouopByAttrByValues(Long spuId) {

        QueryWrapper<Pms_Product_Attr_Value> pms_product_attr_valueQueryWrapper=new QueryWrapper<>();
        pms_product_attr_valueQueryWrapper.eq("spu_id",spuId);
        List<Pms_Product_Attr_Value> pms_product_attr_values = pms_product_attr_value_mapper.selectList(pms_product_attr_valueQueryWrapper);
      //得到当前spu下的全部attrid
        List<Long> attr_id = pms_product_attr_values.stream().map((x) -> {
            return x.getAttr_id();
        }).collect(Collectors.toList());
//得到当前spu拥有的全部分组信息
        QueryWrapper<Pms_Attr_Group> queryWrapper=new QueryWrapper<>();
        queryWrapper.in("paar.attr_id",attr_id).groupBy("pag.attr_group_name");
        List<Pms_Attr_Group> allGroupByattrId = pms_attr_group_mapper.findAllGroupByattrId(queryWrapper);

        List<GroupByAttrByValues> collect = allGroupByattrId.stream().map((item) -> {
            GroupByAttrByValues groupByAttrByValues = new GroupByAttrByValues();
            groupByAttrByValues.setAttr_group_id(item.getAttr_group_id());
            groupByAttrByValues.setAttr_group_name(item.getAttr_group_name());
            List<Pms_Product_Attr_Value> valueList=new ArrayList<>();
            //遍历spu下的全部属性值
            pms_product_attr_values.stream().forEach((x)->{
                //拿到attrid去查询判断
                QueryWrapper<Pms_Attr_Group> queryWrapper1=new QueryWrapper<>();
                queryWrapper1.eq("paar.attr_id",x.getAttr_id());
                List<Pms_Attr_Group> allGroupByattrId1 = pms_attr_group_mapper.findAllGroupByattrId(queryWrapper1);
              //进行判断是否有值
               if(allGroupByattrId1.size()>0){
                   //因为他肯定是1条数据，所以用下标0判断即可
                   if(allGroupByattrId1.get(0).getAttr_group_id()==item.getAttr_group_id()){
                       valueList.add(x);
                   }
               }

            });
            //赋值
            groupByAttrByValues.setPms_product_attr_values(valueList);

            return groupByAttrByValues;
        }).collect(Collectors.toList());
        R r1=new R();
r1.data(collect);
        return r1;
    }
    /*
     * @Description 批量修改属性和属性值
     * @param pms_product_attr_value
     * @return com.shop.utils.R
     * @author liusupeng
     * @date 2020/11/9 12:17
     */
    @Override
    public R updateAttrByValues(List<Pms_Product_Attr_Value> pms_product_attr_value) {

        boolean b = this.updateBatchById(pms_product_attr_value);
        if(b){
            return R.success();
        }
        return R.error(500,"服务器异常");
    }
}
